package co.gov.medellin.ssti.sub.service;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;

import javax.naming.NamingException;

import co.gov.medellin.ssti.sub.common.ConexionFactory;
import co.gov.medellin.ssti.sub.model.dao.DAOFactory;
import co.gov.medellin.ssti.sub.model.dao.IAuditoriaDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.AreaVO;
import co.gov.medellin.ssti.sub.model.vo.AuditoriaVO;
import co.gov.medellin.ssti.sub.model.vo.SubprogramaVO;
import co.gov.medellin.ssti.sub.paoyer.administration.model.vo.UserVO;

public class AuditoriaService {
	/**
	 * 
	 * @param cedula
	 * @param descripcion
	 * @return
	 * @throws SQLException
	 */
	public Collection<UserVO> findUsers(String cedula, String descripcion)
			throws DAOException {
		IAuditoriaDAO auditoriaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			auditoriaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getAuditoriaDAO(con);
			return auditoriaDAO.findUsers(cedula, descripcion);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (auditoriaDAO != null) {
				if (!auditoriaDAO.isConnClosed()) {
					auditoriaDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param tabla
	 * @param fechaCreaDesde
	 * @param fechaMofificaDesde
	 * @param fechaCreaHasta
	 * @param fechaMofificaHasta
	 * @param usuarioCrea
	 * @param usuarioModifica
	 * @return
	 * @throws DAOException
	 */
	public Collection<AuditoriaVO> findReporte(String tabla,
			String fechaCreaDesde, String fechaMofificaDesde,
			String fechaCreaHasta, String fechaMofificaHasta,
			String usuarioCrea, String usuarioModifica) throws DAOException {
		IAuditoriaDAO auditoriaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			auditoriaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getAuditoriaDAO(con);
			return auditoriaDAO.findReporte(tabla, fechaCreaDesde,
					fechaMofificaDesde, fechaCreaHasta, fechaMofificaHasta,
					usuarioCrea, usuarioModifica);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (auditoriaDAO != null) {
				if (!auditoriaDAO.isConnClosed()) {
					auditoriaDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param tabla
	 * @param fechaCreaDesde
	 * @param fechaMofificaDesde
	 * @param fechaCreaHasta
	 * @param fechaMofificaHasta
	 * @param usuarioCrea
	 * @param usuarioModifica
	 * @return
	 * @throws DAOException
	 */
	public Long findCantidadRegistros(String tabla, String fechaCreaDesde,
			String fechaMofificaDesde, String fechaCreaHasta,
			String fechaMofificaHasta, String usuarioCrea,
			String usuarioModifica) throws DAOException {
		IAuditoriaDAO auditoriaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			auditoriaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getAuditoriaDAO(con);
			return auditoriaDAO.findCantidadRegistros(tabla, fechaCreaDesde,
					fechaMofificaDesde, fechaCreaHasta, fechaMofificaHasta,
					usuarioCrea, usuarioModifica);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (auditoriaDAO != null) {
				if (!auditoriaDAO.isConnClosed()) {
					auditoriaDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param iCodeUser
	 * @param strGroupUser
	 * @return
	 * @throws DAOException
	 */
	public Collection<AreaVO> selectSecretaria(int iCodeUser,
			String strGroupUser) throws DAOException {
		IAuditoriaDAO auditoriaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			auditoriaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getAuditoriaDAO(con);
			return auditoriaDAO.selectSecretaria(iCodeUser, strGroupUser);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (auditoriaDAO != null) {
				if (!auditoriaDAO.isConnClosed()) {
					auditoriaDAO.close();
				}
			}
		}
	}

	/**
	 * 
	 * @param strNameGroup
	 * @param lCodeArea
	 * @param strNameUser
	 * @param strFind
	 * @return
	 * @throws DAOException
	 */
	public Collection<UserVO> findUserAdm(String strNameGroup, Long lCodeArea,
			String strNameUser, String strFind) throws DAOException {
		IAuditoriaDAO auditoriaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			auditoriaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getAuditoriaDAO(con);
			return auditoriaDAO.findUserAdm(strNameGroup, lCodeArea,
					strNameUser, strFind);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (auditoriaDAO != null) {
				if (!auditoriaDAO.isConnClosed()) {
					auditoriaDAO.close();
				}
			}
		}
	}

	/**
	 * Metodo encargado de generar la collection de resultados para el reporte
	 * de control de acceso.
	 * 
	 * @param criteria
	 *            SubprogramaVO con parametros para filtrar la busqueda.
	 * @return
	 * @throws DAOException
	 */
	public Collection<AuditoriaVO> findReportControl(SubprogramaVO criteria)
			throws DAOException {
		IAuditoriaDAO auditoriaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			auditoriaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getAuditoriaDAO(con);
			return auditoriaDAO.findReportControl(criteria);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (auditoriaDAO != null) {
				if (!auditoriaDAO.isConnClosed()) {
					auditoriaDAO.close();
				}
			}
		}
	}

	/**
	 * Metodo que consulta el valor descripcion de un usuario en
	 * PAOYER.TCS_USUARIO.
	 * 
	 * @param strNumberDocument
	 *            Nombre del usuario (nro documento).
	 * @return descripcion
	 * @throws DAOException
	 */
	public String findDescriptionUser(String strNumberDocument)
			throws DAOException {
		IAuditoriaDAO auditoriaDAO = null;
		try {
			Connection con = ConexionFactory.getInstance().getConnection();
			auditoriaDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
					.getAuditoriaDAO(con);
			return auditoriaDAO.findDescriptionUser(strNumberDocument);
		} catch (NamingException e) {
			throw new DAOException(e);
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			if (auditoriaDAO != null) {
				if (!auditoriaDAO.isConnClosed()) {
					auditoriaDAO.close();
				}
			}
		}
	}
}
